package lhglogger

import (
	"fmt"
	"runtime"
	"strings"
)

// ILogger ...接口
type ILogger interface {
	Debug(format string, a ...interface{})
	Info(format string, a ...interface{})
	Warning(format string, a ...interface{})
	Error(format string, a ...interface{})
	Fatal(format string, a ...interface{})
}

//基本uint16创造LogLevel类型，用于区分日志级别
type LogLevel uint16

//定义日志级别常量
const (
	DEBUG LogLevel = iota
	INFO
	WARNING
	ERROR
	FATAL
)

// NewLogger  构造函数
func NewConsoleLogger(level string) ConsoleLogger {
	l := parseLevelStr(level)
	//构造为指定级别的对象
	return ConsoleLogger{
		Level: l,
	}
}

// 将传入的字符串的日志级别转换为LogLevel类型的日志级别 如果传入的字符串不识别：默认返回DEBUG
func parseLevelStr(levelstr string) LogLevel {
	//将levelstr同一转为小写
	level := strings.ToLower(levelstr)
	switch level {
	case "debug":
		return DEBUG
	case "info":
		return INFO
	case "warning":
		return WARNING
	case "error":
		return ERROR
	case "fatal":
		return FATAL
	default:
		return DEBUG
	}
}

//将LogLevel 转为字符串
func parseLevelToStr(level LogLevel) string {
	switch level {
	case DEBUG:
		return "debug"
	case INFO:
		return "info"
	case WARNING:
		return "warning"
	case ERROR:
		return "error"
	case FATAL:
		return "fatal"
	default:
		return "debug"
	}
}

func getInfo(skip int) (funcName, fileName string, lineNo int) {
	//Caller()的参数说明：0 表示要获取当前执行runtime.Caller()这个方法的位置。
	//如果说runtime.Caller()封装成了一个函数。你上面一层调用这个函数。你想获取这个函数就传1 依次类推
	pc, file, line, ok := runtime.Caller(skip)
	if !ok {
		fmt.Println("runtime.Caller() failed")
		return
	}
	funcName = runtime.FuncForPC(pc).Name() //根据pc获取函数名称
	// fmt.Println(funcName)
	// fmt.Println(file) //程序文件的路径（绝对路径）
	// fmt.Println(line) //程序行号
	//   funcName=funcName
	fileName = file
	lineNo = line
	return
}
